#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/10/4 10:02
# @Author  : summer
# @Email   : 610658552@qq.com
# @File    : account.py
# @Software: PyCharm
# @Desc    :
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from rest_framework.generics import GenericAPIView

from common.fiters.filter_account import AccountFilter  # 导入自定义过滤器
from common.models import Account  # 导入Account模型
from common.sers.ser_account import AccountSerializer  # 导入序列化器
from common.utils.pagination import EnhancedPageNumberPagination  # 自定义分页（复用项目已有）
from common.utils.rsp import success_response  # 自定义返回体（复用项目已有）
from common.utils.utils_token import TokenUtils


class AccountListCreateView(GenericAPIView):
    """
    Account列表查询 + 新增接口
    - GET: 分页查询账号列表（支持过滤、排序）
    - POST: 新增账号（自动加密密码）
    """
    # 基础查询集：只查「未删除+非压测」的有效账号
    queryset = Account.objects.filter(is_delete=0, pt_flag=0).all()
    serializer_class = AccountSerializer
    pagination_class = EnhancedPageNumberPagination  # 分页配置

    # 过滤/排序后端：支持按字段过滤、按时间/名称排序
    filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
    filterset_class = AccountFilter  # 关联自定义过滤器
    ordering_fields = ["create_time", "username", "mobile", "last_login_time"]  # 支持排序的字段
    ordering = ["-create_time"]  # 默认排序：按创建时间倒序

    def get(self, request, *args, **kwargs):
        """GET请求：分页查询账号列表（强制分页，避免全量数据返回）"""
        # 1. 应用过滤条件
        filtered_qs = self.filter_queryset(self.get_queryset())
        # 2. 分页处理（即使前端不传page，也返回第一页）
        page_qs = self.paginate_queryset(filtered_qs)
        # 3. 序列化数据并返回分页结果
        serializer = self.get_serializer(page_qs, many=True)
        paginated_data = self.paginator.get_paginated_response(serializer.data).data

        return success_response(
            data=paginated_data,
            message="账号列表查询成功"
        )

    def post(self, request, *args, **kwargs):
        """POST请求：新增账号（密码自动加密）"""
        # 调用工具类获取创建者信息（自动处理多渠道token）
        creator = TokenUtils.get_creator_info(request)

        # 强制设置新用户的校区ID
        request_data = request.data.copy()

        # 序列化并保存
        serializer = self.get_serializer(data=request_data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return success_response(
            data=serializer.data,
            message=f"账号「{serializer.validated_data['username']}」创建成功"
        )


class AccountRetrieveUpdateDestroyView(GenericAPIView):
    """
    Account单条操作接口
    - GET: 查询单个账号详情
    - PUT: 全量更新账号（需传所有必填字段）
    - PATCH: 部分更新账号（只传需修改的字段）
    - DELETE: 逻辑删除账号（修改is_delete=1）
    """
    # 查询集：包含所有账号（用于单条查询，后续会过滤有效数据）
    queryset = Account.objects.all()
    serializer_class = AccountSerializer
    lookup_field = "pk"  # URL中主键参数名（对应 <int:pk>）

    def get_object(self):
        """重写获取实例逻辑：只允许操作「未删除+非压测」的有效账号"""
        instance = super().get_object()
        if instance.is_delete == 1 or instance.pt_flag == 1:
            raise ValueError("当前账号不存在或已被删除，无法操作！")
        return instance

    def get(self, request, *args, **kwargs):
        """GET请求：查询单个账号详情"""
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return success_response(data=serializer.data, message="账号详情查询成功")

    def put(self, request, *args, **kwargs):
        """PUT请求：全量更新账号（需传所有必填字段）"""
        instance = self.get_object()
        # partial=False：全量更新（前端需传所有必填字段）
        serializer = self.get_serializer(instance, data=request.data, partial=False)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return success_response(
            data=serializer.data,
            message=f"账号「{instance.username}」全量更新成功"
        )

    def patch(self, request, *args, **kwargs):
        """PATCH请求：部分更新账号（只传需修改的字段）"""
        instance = self.get_object()
        # partial=True：部分更新（前端只需传要修改的字段）
        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return success_response(
            data=serializer.data,
            message=f"账号「{instance.username}」部分更新成功"
        )

    def delete(self, request, *args, **kwargs):
        """DELETE请求：逻辑删除账号（不删除数据库记录，仅修改状态）"""
        instance = self.get_object()
        username = instance.username
        instance.is_delete = 1  # 逻辑删除
        instance.save()

        return success_response(
            data=None,
            message=f"账号「{username}」已成功删除（逻辑删除）"
        )
